package com.ihrm.company;

import com.ihrm.common.utils.IdWorker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;

/**
 * Hello world!
 *
 */
@SpringBootApplication(scanBasePackages = "com.ihrm")    // springboot 包扫描
// 配置 实体类所在的包 jpa 注解扫描
@EntityScan(value = "com.ihrm.domain.company")    // spring data jpa 包扫描
public class CompanyApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(CompanyApplication.class, args);
    }

    /**
     * @为啥不直接导包，而是交给Spring容器管理
     *
     * 1 . 使用 Spring 的依赖注入
     * 通过 Spring 的 @Bean 或 @Autowired 注入 IdWorker，
     * 可以让 Spring 管理这个对象的生命周期，并与其他 Bean 无缝协作。（例如
     *   // @Autowired
     *     private IdWorker idWorker; // 通过依赖注入获取对象
     *     public void someMethod() {
     *         long id = idWorker.nextId();
     *         System.out.println("Generated ID: " + id);
     *     }
     *     ）
     * 优点
     * 解耦：通过依赖注入，MyService 类不需要直接创建 IdWorker，从而降低了类之间的耦合性。
     * 生命周期管理：Spring 会管理 IdWorker 的生命周期，包括初始化和销毁。
     * 易于测试：依赖注入使得单元测试更加容易，可以通过 Mock 对象替换 IdWorker。
     * 利用 Spring 的功能：可以利用 Spring 提供的事务管理、AOP 等功能。
     * 缺点
     * 需要配置：需要在 Spring 配置中定义 IdWorker 的 Bean。
     * 依赖 Spring：必须在 Spring 环境中运行。
     *
     * 2. 直接使用 new 创建对象
     * 你可以直接通过 new 关键字创建 IdWorker 的实例，但这通常不是 Spring 推荐的方式，
     * 尤其是在需要管理对象生命周期或与其他 Spring Bean 交互时。(就是直接在方法中创建对象
     * 例如 IdWorker idWorker = new IdWorker(); // 直接创建对象)
     * 优点
     * 简单直接：不需要额外的配置，直接通过 new 创建对象。
     * 独立性：不依赖 Spring 框架，可以在非 Spring 环境中使用。
     * 缺点
     * 无法利用 Spring 的功能：
     * 无法享受 Spring 的依赖注入功能。
     * 无法利用 Spring 的生命周期管理（如初始化、销毁回调）。
     * 无法利用 Spring 的代理功能（如事务管理、AOP）。
     * 代码耦合性高：直接创建对象会增加类之间的耦合性，不利于单元测试和代码维护。
     * 
     */
    @Bean
    public IdWorker idWorker(){
        return new IdWorker();
    }
}
